﻿-- Function: reGuardarEntrada(integer, character, integer,integer)

-- DROP FUNCTION reGuardarEntrada(integer, character, integer,integer)

CREATE OR REPLACE FUNCTION reGuardarEntrada(smallint, character, integer, integer,integer)
  RETURNS integer AS
$BODY$

DECLARE
	iTipo 		ALIAS FOR $1; --1 = encabezado, 2 = detalle
	cReaPro 	ALIAS FOR $2; --R = Reactivo, P = Producto
	iNumEntrada	ALIAS FOR $3;
	iCodigo		ALIAS FOR $4;
	iCantidad	ALIAS FOR $5;
	xRegistro	record;
	xRegistro2	record;
	
	iCantidadTotal	INT4;
	cClave		character(2);

	
BEGIN
	IF iTipo = 1 THEN -- si es encabezado
	
		IF cReaPro = 'P' then
			cClave = 'EP';
		else if cReaPro = 'R' then
			cClave = 'ER';
			end if;
		end if;
		
		select sum(cantidad) into iCantidadTotal from reentradasdetalle where numentrada = iNumEntrada;
		
		insert into reentradas(numentrada,clave,cantidadtotal) values(iNumEntrada,cClave,iCantidadTotal);
		
		FOR xRegistro IN SELECT codigo, cantidad from reentradasdetalle where numentrada = iNumEntrada 
		LOOP
			IF  cReaPro = 'R' THEN
			
				UPDATE reactivos set existencia = existencia + xRegistro.cantidad where codigo = xRegistro.codigo;
				
			else if cReaPro = 'P' THEN
			
				UPDATE productos set existencia = existencia + xRegistro.cantidad where codigo = xRegistro.codigo;
				
				--restar los reactivos que se utilizan por cada producto
				FOR xRegistro2 IN SELECT codigoreactivo,nececidadgramos from productosdetalle where codigo = xRegistro.codigo
				LOOP
					update reactivos set existencia = existencia - xRegistro2.nececidadgramos where codigo = xRegistro2.codigoreactivo;
					
				END LOOP;
				
				end if;
			end if;
			
		END LOOP;
	
	ELSE	IF iTipo = 2 THEN -- si es detalle
	
			insert into reentradasdetalle(numentrada,codigo,cantidad) values(iNumEntrada,iCodigo,iCantidad);
		
		END IF;
	END IF;
	return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
